package com.ppch.wuwamanus.agent;

import cn.hutool.core.util.StrUtil;
import com.ppch.wuwamanus.agent.model.AgentState;
import com.ppch.wuwamanus.config.FileUtils;
import com.ppch.wuwamanus.exception.BusinessException;
import com.ppch.wuwamanus.exception.ErrorCode;
import com.ppch.wuwamanus.config.CosManager;
import com.qcloud.cos.model.PutObjectResult;
import jakarta.annotation.Resource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.MessageType;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;

/**
 * Package:ppch-ai-agent
 * ClassName:BaseAgent
 *
 * @Author 泡泡茶壶
 * @Create 2025/7/30 19:54
 * @Version 1.0
 * Description:
 *  基础 Agent，用于定义智能体必须有的属性、实现Agent Loop、ReAct模式
 */
@Data
@Slf4j
public abstract class BaseAgent {

    /**
     * 智能体的唯一名称
     */
    private String name;

    /**
     * 智能体的系统提示词
     */
    private String systemPrompt;

    /**
     * 智能体决定下一步行动的提示
     */
    private String nextStepPrompt;

    /**
     * 智能体的执行状态：默认为空闲状态
     */
    private AgentState state = AgentState.IDLE;

    /**
     * LLM 大语言模型
     */
    private ChatClient chatClient;

    /**
     * 允许的最大执行步骤数
     */
    private int maxSteps = 10;

    /**
     * 当前执行步骤数
     */
    private int currentSteps = 0;

    /**
     * 智能体的上下文存储（记忆）
     */
    private List<Message> memoryList = new ArrayList<>();

    /**
     * 执行结果列表
     */
    private List<String> resultList = new ArrayList<>();

    /**
     * 工具调用结果（按照添加顺序排列）
     */
    private Map<String,String> toolCallResult = new LinkedHashMap<>();

    /**
     * 记录一次对话中的所有用户问题，用于判断 AI 是否陷入循环
     */
    private Map<MessageType,String> userQuestionMap = new HashMap<>();

    /**
     * 对话 ID
     */
    private Long chatId;

    /**
     * 关联的上下文大小（默认大小为 20）
     */
    private int chatMemoryRetrieveSize = 20;

    /**
     * 具体执行方法
     *
     * @return 执行结果
     */
    public abstract String step();

}
